package main

import "fmt"

func main() {
	//var a = A{123}
	//a.testMethod()
	//methodExercise1Main()
	methodExercise2Main()
}

type A struct {
	Num int
}

func (a A) testMethod() {
	fmt.Println(a.Num)
}

type Person struct {
	Name string
	Age  int
}

func (person *Person) speak() {
	fmt.Printf("%s是一个好人\n", person.Name)
}

func (person *Person) calculate() {
	var sum int = 0
	for i := 1; i <= 1000; i++ {
		sum += i
	}
	fmt.Printf("1+...+1000 = %d\n", sum)
}

func (person *Person) calculate2(n int) {
	var sum int = 0
	for i := 1; i <= n; i++ {
		sum += i
	}
	fmt.Printf("1+...+%d = %d\n", n, sum)
}

func (person *Person) getSum(n1, n2 int) int {
	return n1 + n2
}

func (person *Person) String() string {
	return fmt.Sprintf("my name is %s, i'm %d years old", (*person).Name, (*person).Age)
}

func methodExercise1Main() {
	// 1、给Person结构体添加speak方法，输出xxx是一个好人
	// 2、给Person结构体添加calculate方法，可以计算从1+.....+1000的结果
	// 3、给Person结构体添加calculate2方法，可以接收一个n,计算1+...+n的结果
	// 4、给Person结构体添加getSum方法，可以计算两个数的和，并返回结果
	var person = Person{"Jack", 20}
	fmt.Println(&person)
	person.speak()
	person.calculate()
	person.calculate2(999)
	var n1 int = 10
	var n2 int = 20
	fmt.Printf("%d + %d = %d\n", n1, n2, person.getSum(n1, n2))
}

type Rectangle struct {
	length int
	width  int
}

func (rectangle *Rectangle) Generate(length, width int) {
	rectangle.length = length
	rectangle.width = width
	for i := 0; i < length; i++ {
		for j := 0; j < width; j++ {
			fmt.Printf("*")
		}
		fmt.Println()
	}
}

func (rectangle *Rectangle) Area() int {
	return rectangle.length * rectangle.width
}

func (rectangle *Rectangle) String() string {
	return fmt.Sprintf("[rectangle] length: %d, width: %d, area: %d", rectangle.length, rectangle.width, rectangle.Area())
}

func methodExercise2Main() {
	// 1、编写一个结构体RectangleUtils，写一个方法，接收长length和宽width，打印一个length\*width的矩形
	// 2、编写一个方法，计算该矩形的面积，将其作为方法返回值
	var rectangle Rectangle
	rectangle.Generate(10, 20)
	fmt.Println(&rectangle)
}
